package com.yeyks.commonReference.service.order;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yeyks.account.dal.domain.AccountInfo;
import com.yeyks.common.ajax.AjaxResponseBody;
import com.yeyks.common.appcommon.dto.account.AppIndexDTO;
import com.yeyks.common.appcommon.dto.finance.AppHotelBillDTO;
import com.yeyks.common.appcommon.dto.order.AppOrderInfoDTO;
import com.yeyks.common.appcommon.dto.order.AppOrderStatusDTO;
import com.yeyks.common.appcommon.param.QueryStatFeeParam;
import com.yeyks.common.appcommon.param.finance.QueryHotelBillParam;
import com.yeyks.common.appcommon.param.order.GetOrderDetailParam;
import com.yeyks.common.appcommon.param.order.GetOrderNoticeParam;
import com.yeyks.common.appcommon.param.order.QueryOrderParam;
import com.yeyks.common.appcommon.param.order.UpdateCheckInParam;
import com.yeyks.common.appcommon.result.CommonPage;
import com.yeyks.common.appcommon.result.CommonResult;
import com.yeyks.common.base.PageResult;
import com.yeyks.common.param.*;
import com.yeyks.common.param.finance.WithdrawalPeriodOrderParam;
import com.yeyks.common.param.screen.DataScreenOrderParam;
import com.yeyks.common.result.*;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.yeyks.common.result.order.UserOrderResult;
import com.yeyks.common.result.screen.DataScreenCityOrderResult;
import com.yeyks.common.result.screen.DataScreenOrderMonthResult;
import com.yeyks.common.result.screen.DataScreenOrderResult;
import com.yeyks.commonReference.pojo.param.OrderInfoC2bPlaceAnOrderParam;
import com.yeyks.hotel.dal.domain.HotelInfo;
import com.yeyks.order.dal.domain.OrderHead;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.yeyks.order.param.*;
import com.yeyks.commonReference.pojo.vo.OrderHeadOrderDetailsVo;
import com.yeyks.order.vo.OrderHeadFindNoPayOrderVo;
import com.yeyks.order.vo.OrderHeadOrderListVo;
import com.yeyks.order.vo.OrderHeadC2bPlaceAnOrderVo;
import com.yeyks.order.vo.OrderHeadRefundAmountVo;


/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author yun
 * @since 2019-06-25
 */
public interface OrderHeadService extends IService<OrderHead> {

    /**
     * 分页获取订单
     *
     * @param loginUser
     * @param param
     * @return
     */
    PageResult<OrderListResult> myList(AccountInfo loginUser, OrderListParam param);

    /**
     * 获取订单中券的券面值
     *
     * @param orderHead
     * @return
     */
    Integer getCouponPrice(OrderHead orderHead);

    /**
     * 通过订单获取酒店图片
     *
     * @param orderHead
     * @return
     */
    List<String> getHotelPics(OrderHead orderHead);

    /**
     * 新订单退款
     *
     * @param operatorInfo
     * @param orderNo
     * @param accept       true同意，false不同意
     * @param type         user和hotel
     */
    @Deprecated
    void refund(AccountInfo operatorInfo, String orderNo, Boolean accept, String type);

    /**
     * 新订单退款
     *
     * @param operatorInfo
     * @param orderNo
     */
    void refundWeb(AccountInfo operatorInfo, String orderNo);

    /**
     * 导出订单
     *
     * @param loginUser
     * @param param
     * @return
     */
    List<OrderDownloadResult> selectDownloadOrder(AccountInfo loginUser, OrderDownParam param);

    /**
     * 将订单对象转换成Map<Integer, HotelInfo>，key为酒店id，value为酒店
     *
     * @param orderHeads
     * @return
     */
    Map<Integer, HotelInfo> getHotelInfoMap(List<OrderHead> orderHeads);

    /**
     * 根据订单号修改订单状态
     *
     * @param orderNo
     * @param status
     * @return
     */
    Boolean updateStatusByOrderNo(String orderNo, Integer status);

    /**
     * 订单详情
     *
     * @param orderNo
     * @return
     */
    OrderHeadDetail getOrderDetail(String orderNo);

    /**
     * 根据订单号获取订单
     *
     * @param orderNo 订单号
     * @return
     */
    OrderHead getByOrderNo(String orderNo);

    /**
     * 根据第三方订单号获取订单
     *
     * @param sourceOrderId 订单号
     * @return
     */
    OrderHead getBySourceOrderId(String sourceOrderId);

    /**
     * 查询订单信息
     *
     * @param param
     * @return
     */
    PageInfo<OrderHeadOrderListVo> orderList(OrderHeadOrderListParam param);

    /**
     * 订单详情
     *
     * @param param
     * @return
     */
    OrderHeadOrderDetailsVo orderDetails(OrderHeadOrderDetailsParam param);

    /**
     * C端取消订单
     *
     * @param param
     * @return
     */
    Boolean cancelOrder(OrderHeadCancelOrderParam param);

    //退款inner
    void cancelOrderNoCheck(String orderNo, String refundReason);

    //获取退款金额
    OrderHeadRefundAmountVo refundAmount(OrderHeadRefundAmountParam param);

    /**
     * 删除订单
     *
     * @param param
     * @return
     */
    Boolean delOrder(OrderHeadDelOrderParam param);

    /**
     * 评价订单
     *
     * @param param
     * @return
     */
    Boolean evaluateOrder(OrderHeadEvaluateOrderParam param);

    /**
     * 判断今天是否可以使用优惠券
     * true 可以使用
     * false 不可以使用
     *
     * @param userId
     * @return
     */
    Boolean checkOrderUserCouponInfoCount(Integer userId);


    //判断该酒店是否能用大礼包券
//    Boolean checkHotelCanBeUseCouponInfoType8(Integer hotelId);

    /**
     * 下单
     *
     * @param param
     * @return
     */
    OrderHeadC2bPlaceAnOrderVo c2bPlaceAnOrder(OrderInfoC2bPlaceAnOrderParam param);

    OrderHeadFindNoPayOrderVo findNoFinishOrder(OrderHeadFindNoPayOrderParam param);

    /**
     * 统计查询订单总额和订单数
     *
     * @param loginUser
     * @param param
     * @return
     */
    StatisticalResult statFee(AccountInfo loginUser, StatisticalParam param);

    /**
     * 统计月和日
     *
     * @param loginUser
     * @param type
     * @return
     */
    List<StatisticalResult> statMonthAndDay(AccountInfo loginUser, Integer type, String vipFlag);

    /**
     * 查询酒店订单数量
     *
     * @param hotelId
     * @return
     */
    int orderCount(Integer hotelId, Integer vipFlag, Integer status);

    //=================admin - App 相关的服务接口=====================

    /**
     * admin - App 查询订单列表
     *
     * @param queryOrderParam 查询条件
     * @param convert         操作人
     * @return 返回分页结果
     */
    CommonResult<CommonPage<AppOrderInfoDTO>> myAdminAppPageList(QueryOrderParam queryOrderParam, AccountInfo convert);

    /**
     * admin - App 查询订单详情
     *
     * @param getOrderDetailParam 查询参数
     * @param convert             操作人
     * @return 返回详情信息
     */
    CommonResult<AppOrderInfoDTO> getAdminAppOrderDetail(GetOrderDetailParam getOrderDetailParam, AccountInfo convert);

    /**
     * admin - App 确认入住
     *
     * @param updateCheckInParam 入住输入参数
     * @param convert            操作人
     * @return 返回结果
     */
    CommonResult checkIn(UpdateCheckInParam updateCheckInParam, AccountInfo convert);

    /**
     * admin - App 首页统计信息
     *
     * @param queryStatFeeParam 输入参数
     * @param convert           操作人
     * @return 返回结果
     */
    CommonResult<List<AppIndexDTO>> statFeeByAdminAppIndex(QueryStatFeeParam queryStatFeeParam, AccountInfo convert);

    /**
     * admin - App 首页获取订单通知
     *
     * @param getOrderNoticeParam 查询参数
     * @param convert             操作人
     * @return 返回结果
     */
    CommonResult<CommonPage<AppOrderInfoDTO>> getOrderNotice(GetOrderNoticeParam getOrderNoticeParam, AccountInfo convert);

    /**
     * admin - App 统计订单数和订单总额
     *
     * @param queryStatFeeParam 查询参数
     * @param convert           操作人
     * @return 返回结果
     */
    CommonResult<List<AppIndexDTO>> getStatisticsData(QueryStatFeeParam queryStatFeeParam, AccountInfo convert);

    /**
     * 通过订单号增加房态
     *
     * @param orderNo 订单号
     * @param vipFlag 是否是甄选订单(0不是，1是)
     * @param type    0代表订单取消，1代表订单退款
     */
    Boolean setRoomCount(String orderNo, Integer vipFlag, Integer type);

    /**
     * 查询酒店上次提现到现在的已完成订单
     *
     * @param param
     * @return
     */
    PageResult<OrderListResult> listHotel(WithdrawalHotelOrderParam param);

    /**
     * 查询酒店上次提现到现在的已完成vip订单
     *
     * @param param
     * @return
     */
    PageResult<OrderListResult> periodListHotel(WithdrawalPeriodOrderParam param);

    /**
     * 财务对账单列表
     *
     * @param param
     * @return
     */
    PageResult<HotelStatementResult> listStatement(HotelStatementParam param);

    /**
     * 财务对账单导出
     *
     * @param param
     * @return
     */
    List<HotelStatementResult> statementDownload(HotelStatementDownloadParam param);

    /**
     * 酒店财务对账单统计
     *
     * @param param
     * @return
     */
    List<StatisticalHotelResults> hotelStatementStat(AccountInfo loginUser, HotelStatementStatParam param);

    /**
     * 酒店财务对账单统计导出
     *
     * @param loginUser
     * @param param
     * @return
     */
    List<StatisticalHotelDownLoadResult> hotelStatementStatDownload(AccountInfo loginUser, HotelStatementStatDownLoadParam param);

    /**
     * admin-app 财务对账单列表
     *
     * @param param 查询参数
     * @return 返回结果
     */
    CommonResult<CommonPage<AppHotelBillDTO>> queryHotelBill(QueryHotelBillParam param);

    /**
     * 酒店账单信息列表
     *
     * @param param       查询参数
     * @param accountInfo 操作人
     * @return 返回结果
     */
    CommonResult<List<AppIndexDTO>> queryBillByHotelId(QueryStatFeeParam param, AccountInfo accountInfo);

    /*
        calendarModifyType 1,下单,2,取消,3,成功,4,成功取消
         */
    void updateRoomCalendarInfo(String orderNo, int calendarModifyType);

    /**
     * 获取订单【状态】列表接口
     *
     * @param convert 操作人
     * @return
     */
    CommonResult<List<AppOrderStatusDTO>> getOrderStatusList(AccountInfo convert);

    /**
     * 查询该用户是否是注册n天下的第一单
     *
     * @param day 大于等于0的数，0代表是否是注册当天下的单
     * @return
     */
    Boolean userOrderIsRegistTime(OrderHead orderHead, Integer day);

    /**
     * 判断是否是用户第一单
     *
     * @param orderHead
     * @return
     */
    Boolean isFirstUserOrder(OrderHead orderHead);

    /**
     * 用户最近消费时间
     *
     * @param userId
     * @param vipFlag 订单类型逗号隔开，0 c2b，1vip，2b2c，3精选
     * @return
     */
    Date lastOrderTime(Integer userId, Integer vipFlag);

    /**
     * 用户累计消费金额和累计单数(订单完成)
     *
     * @param userId
     * @param vipFlag 订单类型逗号隔开，0 c2b，1vip，2b2c，3精选
     * @return
     */
    UserOrderResult selectUserTotalAmount(Integer userId, Integer vipFlag);

    /**
     * 数据大屏之全国销售额
     *
     * @param param
     * @return
     */
    DataScreenOrderResult statOrder(DataScreenOrderParam param);

    /**
     * 数据大屏之全国城市业绩
     *
     * @return
     */
    List<DataScreenCityOrderResult> statCityOrder();

    /**
     * 同步订单中的provinceName字段
     *
     * @return
     */
    Boolean syncProvinceName();

    /**
     * 数据大屏之月销售额
     *
     * @param vipFlag 订单类型逗号隔开，0 c2b，1vip，2b2c，3精选
     * @return
     */
    List<DataScreenOrderMonthResult> statMonthOrder(String vipFlag);

    /**
     * 查询付费用户
     *
     * @return
     */
    int orderPayUserCount();

    /**
     * 将发票置为null
     * @param orderNo
     */
    void updateInvoiceIsNull(String orderNo);
}
